﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

using Model;
using Interfaces;
using System.Collections;

/**
 * Vandsparesystem er vores controller, som sørger for at adskille GUI fra resten af modellen. Alle metodekald fra GUI skal gå igennem vores controller
 * som så sørger for at sende dem videre ned igennem modellen, til de korrekte klasser.
 * vores controller indeholder nogle sessioncontrollere, som holder vores aktuelle objekter, der arbejdes med
 * på den måde sparer vi en masse kald ned gennem modellen hver gang vi skal bruge nogle oplysninger.
 * **/

namespace Controller
{
    public class vandspareSystem
    {
        private DBFacade dbFacade;
        public DBInfo info;
        public KundeCol kundeCol;
        public ArtikelCol artikelCol;
        public string DBtjek;
        public Tilbud itilbud;
        
        // AØ Sessionsvariable
        [NonSerialized]
        public Kunde aktuelKunde; // Sessionsvariabel for aktuel kunde
        public Virksomhedsdata aktuelVirksomhedsData; // Sessionsvariabel for aktuel virksomhed
        public Installation aktuelInstallation; // Sessionsvariabel for installation
        
        List<Kunde> KundeListe;
        List<Tilbudslinie> tilbudslinieListe;
        List<Installation> tempInstallationsliste;
        

        //Konstruktører
        public vandspareSystem()
        {
            info = new DBInfo(0);
            dbFacade = new DBFacade(info.USER, info.PASSWD, info.SERVER, info.DATABASE);
            if (dbFacade.CheckForbindelse())
            {
                DBtjek = "Server1";
            }
            else
            {
                SkiftTilBackupDB();
                bool tf = dbFacade.CheckForbindelse();
                if (tf == true)
                {
                    DBtjek = "Server2";
                }
            } 
            KundeListe = new List<Kunde>();
            artikelCol = new ArtikelCol();
            tilbudslinieListe = new List<Tilbudslinie>();
            tempInstallationsliste = new List<Installation>();
        }


        #region Generelle metoder
        // ------------ Generelle metoder -------------------------------------------------------------------------------------------------
        public void DBConnect()
        {
            dbFacade.Connect();
        }


        public bool CheckDBForbindelse()
        {
            return dbFacade.CheckForbindelse();
        }


        public int TjekDB()
        {
            if (DBtjek == "Server2")
            {
                return 1;
            }
            else if (DBtjek == "Server1")
            {
                return 0;
            }
            else
            {
                return -1;
            }
        }


        public void SkiftTilBackupDB()
        {
            info = new DBInfo(1);
            dbFacade = new DBFacade(info.USER, info.PASSWD, info.SERVER, info.DATABASE);
        }

        #endregion

        #region Opstart af program
        // ------------ Start af program - hent data fra database til model -------------------------------------------------------------------------------
        public void FyldCollections()
        {       
            kundeCol = new KundeCol(dbFacade.FyldKundeCol()); //fylder kundeCol når programmet starter
            fyldArtikelCol();

            for (int l = 0; l < kundeCol.KundeCount(); l++)
            {
                kundeCol.Kunder[l].VirkData(dbFacade.FyldVirksomhedCol(kundeCol.Kunder[l].Kundenr)); //fylder kundens virksomhedsdata liste når programmet starter
            }

            for (int m = 0; m < kundeCol.KundeCount(); m++)
            {
                for (int n = 0; n < kundeCol.Kunder[m].KundeDataCount(); n++)
                {

                    kundeCol.Kunder[m].Virksomhedsdata[n].InstData(dbFacade.FyldInstallationsListe(kundeCol.Kunder[m].Virksomhedsdata[n].Virksomhedsid)); //fylder KUNDENS VIRKSOMHEDSDATAS installationslister
                }
            }
        

            
            for (int i = 0; i < kundeCol.KundeCount(); i++)//for hver kunde i kundelisten
            {
                List<Tilbud> tilbudsliste = new List<Tilbud>();
                tilbudsliste = dbFacade.FyldTilbudsliste(kundeCol.Kunder[i].Kundenr);
                kundeCol.Kunder[i].TilbudsListe1 = tilbudsliste;
            }

            for (int k = 0; k < kundeCol.KundeCount(); k++)
            {
                for (int j = 0; j < kundeCol.Kunder[k].TilbudsListe1.Count; j++)
                {
                    int tal = dbFacade.HentTilbudsLinieID(kundeCol.Kunder[k].Kundenr, kundeCol.Kunder[k].TilbudsListe1[j].Dato);
                    kundeCol.Kunder[k].TilbudsListe1[j].TilbudsLinier1 = dbFacade.FyldTilbudslinieListe(tal);
                    //kundeCol.Kunder[i].Virksomhedsdata[j].InstData(dbFacade.FyldInstallationsListe(kundeCol.Kunder[i].Virksomhedsdata[j].Virksomhedsid)); //fylder KUNDENS VIRKSOMHEDSDATAS installationslister
                }
            }
        }


        //mads returner artikelliste til tilbudsformen
        public List<IArtikel> HentArtikelListe()
        {
            List<IArtikel> ArtikelListe = new List<IArtikel>();

            for (int i = 0; i < artikelCol.LISTE.Count; i++)
            {
                ArtikelListe.Add(artikelCol.LISTE[i]);
            }
            return ArtikelListe;
        }


        //MADS henter kunder i en liste
        public List<IKunde> HentKunder()
        {
            try
            {

            KundeListe = kundeCol.Kunder;
            List<IKunde> IkundeListe = new List<IKunde>();
            foreach (Kunde kunde in KundeListe)
            {
                IkundeListe.Add(kunde);
            }
            return IkundeListe;

            }
            catch (Exception)
            {

                return null;
            }
        }


        private void fyldArtikelCol()
        {
            artikelCol.LISTE = dbFacade.HentAlleArtikler();
        }


        //jesper,mads henter kundens installationer
        public List<IInstallation> HentInstallationer(string navn)
        {
            for (int i = 0; i < aktuelKunde.Virksomhedsdata.Count; i++)
            {
                if (aktuelKunde.Virksomhedsdata[i].Navn == navn)
                {
                    aktuelVirksomhedsData = aktuelKunde.Virksomhedsdata[i];
                    tempInstallationsliste = aktuelKunde.Virksomhedsdata[i].Installationer;
                    List<IInstallation> IInstListe = new List<IInstallation>();
                    foreach (Installation inst in tempInstallationsliste)
                    {
                        IInstListe.Add(inst);
                    }
                    return IInstListe;
                }
            }
            return null;
        }

        #endregion

        #region Arbejde med artikler
        // ------------ Arbejde med artikler -------------------------------------------------------------------------------------------------


        public bool OpretArtikel(int varenr, double literprmin, double pris, string beskrivelse)
        {
            Artikel nyArtikel = artikelCol.OpretArtikel(varenr, beskrivelse, literprmin, pris);
            //smid i collection
            artikelCol.Tilfoej(nyArtikel);
            //smid i databasen
           return dbFacade.GemArtikel(nyArtikel);
            
        }


        public bool CheckOmArtikelFindes(int varenr)
        {
            return artikelCol.CheckOmArtikelFindes(varenr);
        }


        //Jim - Slet/Rediger Artikel
        public bool SletArtikel(int varenr)
        {
            artikelCol.SletArtikel(varenr);
            return dbFacade.SletArtikel(varenr);
        }

        public bool OpdaterArtikel(int varenr, double pris, double ltrprmin, string beskrivelse)
        {
            artikelCol.OpdaterArtikel(varenr, pris, ltrprmin, beskrivelse);
            return dbFacade.OpdaterArtikel(varenr, pris, ltrprmin, beskrivelse);
        }

        #endregion

        #region Arbejde med udregninger
        // ------------ Arbejde med udregninger -------------------------------------------------------------------------------------------------
        // AØ opret udregning //edit Jim
        public IVandspareudregning OpretUdregning()
        {
            return new Vandspareudregning(aktuelVirksomhedsData);
        }
        #endregion

        #region Arbejde med virksomhedsdata
        // ------------ Arbejde med virksomhedsdata------------------------------------------------------------------------------------------------

        // AØ FindVirksomhedsData
        public Virksomhedsdata FindVirksomhedsdata(int kundenr, int virksomhedsid)
        {
            Kunde kunde = kundeCol.FindKunde(kundenr);
            Virksomhedsdata fundetVirksomhedsdata = kunde.FindVirksomhedsdata(virksomhedsid);
            return fundetVirksomhedsdata;
        }
        
        
        // AØ hent virksomhedsdata
        public IVirksomhedsdata hentVirksomhedsData(string navn)
        {
            for (int i = 0; i < aktuelKunde.Virksomhedsdata.Count; i++)
            {
                if (aktuelKunde.Virksomhedsdata[i].Navn == navn)
                {
                    aktuelVirksomhedsData = aktuelKunde.Virksomhedsdata[i];
                }
            }
            return aktuelVirksomhedsData;
        }


        //Mads - henter aktuelle virksomhedsdata til TILBUD
        public IVirksomhedsdata hentAktVirkDataTILBUD()
        {
            return aktuelVirksomhedsData;
        }


        // AØ OpretVirksomhedsdata
        public bool OpretVirksomhedsdata(string navn, int kundenr)
        {
            
            try
            {
                // Bruger 0 værdier, da vi skal indtaste dem EFTER oprettelsen i den dynamiske liste - ved oprettelsen af en udregning
                double nuvaereneforbrug = 0;
                double forbrugmeddyse = 0;
                double sidsteaarsforbrug = 0;
                int antalpersoner = 0;
                double vandpris = 0;
                double vandafgift = 0;

                int virksomhedsid;

                Kunde kunde = kundeCol.FindKunde(kundenr);

                dbFacade.OpretVirksomhedsData(navn, nuvaereneforbrug, forbrugmeddyse, sidsteaarsforbrug, antalpersoner, vandpris, vandafgift, kundenr);

                //TJEK - TO DO lav en metode der henter det virksomhedsid der er størst, derefter pludses med 1 for at få det nye.   TJEK
                virksomhedsid = dbFacade.HentVirksomhedsdataid();


                aktuelVirksomhedsData = kunde.OpretVirksomhedsdata(virksomhedsid, navn, nuvaereneforbrug, forbrugmeddyse, sidsteaarsforbrug, antalpersoner, vandpris, vandafgift);
                
                foreach (Installation ins in tempInstallationsliste)
                    aktuelVirksomhedsData.TilfoejInstallation(ins);

                //tempInstallationsliste 
                foreach (Installation inst in aktuelVirksomhedsData.Installationer)
                {
                    dbFacade.TilfoejInstallation(inst.Forbrugspct, inst.Betegnelse, virksomhedsid);
                }
                return true;
            }
            catch
            {
                return false;
            }

        }

        // AØ find navn på virksomhedsdata
        public string FindVirksomhedsDataNavn(int i, int kundenr)
        {
            return aktuelKunde.FindVirksomhedsDataNavn(i);
        }

        // AØ tæl hvor stor virksomhedsdatalisten under kunden er
        public int KundeDataCount(int kundenr)
        {
            aktuelKunde = kundeCol.FindKunde(kundenr);
            return aktuelKunde.KundeDataCount();
        }


        //MADS ændrer værdier i aktuelvirksomhedsdata og overskriver det pågældende virkdata objekt i kundens liste
        public IVandspareudregning AendreVirksomhedsdataVaerdier(int antalpersoner, double forbrugUrobolator, double forbrugMrobolator, double sidsteaarsforbrug, double vandpris, double vandafgift)
        {
            aktuelVirksomhedsData.Antalpersoner = antalpersoner;
            aktuelVirksomhedsData.Nuvaereneforbrug = forbrugUrobolator;
            aktuelVirksomhedsData.Forbrugmeddyse = forbrugMrobolator;
            aktuelVirksomhedsData.Sidsteaarsforbrug = sidsteaarsforbrug;
            aktuelVirksomhedsData.Vandpris = vandpris;
            aktuelVirksomhedsData.Vandafgift = vandafgift;
            int kundenr = aktuelKunde.Kundenr;
            dbFacade.OpretUdregning(aktuelVirksomhedsData, aktuelKunde.Kundenr);
            for (int i = 0; i < aktuelKunde.Virksomhedsdata.Count; i++)
            {
                if (aktuelKunde.Virksomhedsdata[i].Navn == aktuelVirksomhedsData.Navn)
                {
                    aktuelKunde.Virksomhedsdata[i] = aktuelVirksomhedsData;
                }

            }
            return OpretUdregning();
        }


        //mads henter kundens virksomhedsdata
        public List<IVirksomhedsdata> HentKundesVirkData()
        {
            List<IVirksomhedsdata> IVirkListe = new List<IVirksomhedsdata>();
            foreach (Virksomhedsdata virkdata in aktuelKunde.Virksomhedsdata)
            {
                IVirkListe.Add(virkdata);
            }
            return IVirkListe;
        }

        #endregion

        #region Arbejde med tilbud
        // ------------ Arbejde med tilbud------------------------------------------------------------------------------------------------

        //MADS opretter objekter til tilbudsrapporten
        public List<ITilbudsrapport> TilbudsRapport(DateTime dato1)
        {
            string navn = aktuelKunde.Navn;
            string adresse = aktuelKunde.Adresse;
            int kundenr = aktuelKunde.Kundenr;

            List<Tilbudsrapport> tilbudsrapportListe = new List<Tilbudsrapport>();

            for (int j = 0; j < aktuelKunde.TilbudsListe1.Count; j++)
            {

                string tjekdato = Convert.ToString(dato1);
                if (tjekdato == aktuelKunde.TilbudsListe1[j].Dato.ToString())
                {
                    for (int i = 0; i < aktuelKunde.TilbudsListe1[j].TilbudsLinier1.Count; i++)
                    {

                        DateTime dato = aktuelKunde.TilbudsListe1[j].Dato;
                        double bespar = aktuelKunde.TilbudsListe1[j].SparetKr;
                        int artnr = aktuelKunde.TilbudsListe1[j].TilbudsLinier1[i].Varenr;
                        string beskriv = aktuelKunde.TilbudsListe1[j].TilbudsLinier1[i].Beskriv;
                        int antal = aktuelKunde.TilbudsListe1[j].TilbudsLinier1[i].Antal;
                        double pris = aktuelKunde.TilbudsListe1[j].TilbudsLinier1[i].Pris;
                        if (i == 0)
                        {
                            Tilbudsrapport tilbudsrapport = new Tilbudsrapport(navn, kundenr, adresse, dato, bespar, artnr, beskriv, antal, pris);
                            tilbudsrapportListe.Add(tilbudsrapport);
                        }
                        else
                        {
                            Tilbudsrapport tilbudsrapport = new Tilbudsrapport(artnr, beskriv, antal, pris, bespar);
                            tilbudsrapportListe.Add(tilbudsrapport);
                        }
                    }
                }
            }
            List<ITilbudsrapport> ITilbudsRap = new List<ITilbudsrapport>();
            foreach (Tilbudsrapport tilbudsrap in tilbudsrapportListe)
            {
                ITilbudsRap.Add(tilbudsrap);
            }
            return ITilbudsRap;
        }


        //Mads opret TILBUD
        public ITilbud OpretTilbud(DateTime dato, double koebssum, double sparetKr)
        {
            itilbud = aktuelKunde.OpretTilbud(dato, koebssum, sparetKr);
            dbFacade.OpretTilbud(aktuelKunde.Kundenr, aktuelVirksomhedsData.Virksomhedsid, koebssum, dato, Convert.ToInt32(itilbud.Tilbagebetaling), sparetKr);
            aktuelKunde.TilbudsListe1.Add(itilbud);

            return itilbud;
        }

        //MADS - tilfæjer tilbudslinier til nye tilbud
        public void TilfoejTilbudsLinier()
        {
            int tilbudsid = dbFacade.HentTilbudsId();

            for (int i = 0; i < tilbudslinieListe.Count; i++)
            {
                dbFacade.OpretTilbudsLinie(tilbudslinieListe[i].Antal, tilbudslinieListe[i].Varenr, tilbudsid, tilbudslinieListe[i].Beskriv, tilbudslinieListe[i].Pris);
                int tilbud = aktuelKunde.TilbudsListe1.Count - 1;
                aktuelKunde.TilbudsListe1[tilbud].TilbudsLinier1.Add(tilbudslinieListe[i]);
            }
            tilbudslinieListe.Clear();
        }

        //MADS OPRETTER TILBUDSLINIELISTE
        public void OpretTilbudsLinie(int antal, int varenr)
        {
            Artikel artikel = artikelCol.FindArtikel(varenr);
            string beskriv = artikel.Beskrivelse;
            double pris = artikel.Pris;
            int tal = aktuelKunde.TilbudsListe1.Count();
            Tilbudslinie tilbudslinie = aktuelKunde.TilbudsListe1[tal - 1].OpretTilbudsLinie(antal, varenr, beskriv, pris);
            tilbudslinieListe.Add(tilbudslinie);
        }


        //mads henter kundens tilbud
        public List<ITilbud> HentKundesTilbudsData()
        {
            List<ITilbud> ItilbudListe = new List<ITilbud>();
            foreach (Tilbud tilbud in aktuelKunde.TilbudsListe1)
            {
                ItilbudListe.Add(tilbud);
            }
            return ItilbudListe;
        }

        #endregion

        #region Arbejde med installationer
        // ------------ Arbejde med Installationer -------------------------------------------------------------------------------------------------

        //mads hent liste med installationer fra aktuelvirkdata
        public List<IInstallation> hentAktVirkDataInst()
        {

            List<IInstallation> IInstListe = new List<IInstallation>();
            foreach (Installation inst in aktuelVirksomhedsData.Installationer)
            {
                IInstListe.Add(inst);
            }
            return IInstListe;
        }


        //Mads finder kunde 0's Installationer
        public List<IInstallation> FindStandard()
        {
            List<IInstallation> IInstListe = new List<IInstallation>();
            List<Installation> standardinst = new List<Installation>();
            Kunde standardKunde = kundeCol.FindKunde(0);
            int tal = standardKunde.Virksomhedsdata[0].Installationer.Count();
            standardinst = standardKunde.Virksomhedsdata[0].Installationer;
            foreach (Installation inst in standardinst)
            {

                IInstListe.Add(inst);
            }
            return IInstListe;
        }


        // AØ Find aktive indstallationer under specifik virksomhedsdata
        public List<IInstallation> FindAktiveInstallationer(string virksomhedsdatanavn)
        {
            List<IInstallation> InstallationsListe = new List<IInstallation>(); // Opretter en tom liste til installationer
            Kunde standardKunde = kundeCol.FindKunde(0); // Finder standardkunden vha. 0(kundenr)
            for (int i = 0; i < standardKunde.Virksomhedsdata.Count; i++) // Sålænge der er virksomhedsdata
            {
                // Kun virksomhedsdata med rigtigt virksomhedsnavn
                if (standardKunde.Virksomhedsdata[i].Navn == virksomhedsdatanavn)
                {
                    // Henter Kundens installationer ind i den nye liste
                    tempInstallationsliste = standardKunde.Virksomhedsdata[i].Installationer;
                    foreach (Installation inst in tempInstallationsliste)
                    {
                        InstallationsListe.Add(inst);

                    }
                }
            }
            return InstallationsListe;
        }


        //MADS - rydder tempListen inden den skal bruges
        public void RydTempListe()
        {
            tempInstallationsliste.Clear();
        }

        // AØ Gem installation i InstallationsTempListen
        public void ModtagTempInstallation(string betegnelse, double forbrugpct)
        {
            int i = 0;
            Installation inst = kundeCol.Kunder[i].Virksomhedsdata[i].OpretInstallation(forbrugpct, betegnelse);
            tempInstallationsliste.Add(inst);
        }


        // AØ Tilføjer installation under virksomhedsdata
        public bool TilfoejInstallation(double forbrugpct, string betegnelse, int virksomhedsid)
        {
            int output;
            output = dbFacade.HentMaxInstallationsId();

            if (dbFacade.TilfoejInstallation(forbrugpct, betegnelse, virksomhedsid))
            {
                Virksomhedsdata virksomhedsdata = FindVirksomhedsdata(0, virksomhedsid);
                try
                {
                    aktuelInstallation = virksomhedsdata.OpretInstallation(forbrugpct, betegnelse);
                    virksomhedsdata.TilfoejInstallation(aktuelInstallation);

                    return true;
                }
                catch
                { return false; }
            }
            else
            {
                return false;
            }

        }


        //mads ændrer en installations værdi
        public void NyInstVaerdi(double instvaerdi, int placering)
        {
            int virksomhedsid = aktuelVirksomhedsData.Virksomhedsid;
            tempInstallationsliste[placering - 6].Forbrugspct = instvaerdi;
            dbFacade.AendreInstallationsvaerdi(virksomhedsid, tempInstallationsliste[placering - 6]);
            aktuelVirksomhedsData.OpdaterInstallation(tempInstallationsliste[placering - 6]);
        }

        #endregion

        #region Arbejde med kunder
        // ------------ Arbejde med kunder -------------------------------------------------------------------------------------------------

        //Jesper - Findkunde
        public IKunde FindKunde(int kundenr)
        {
            aktuelKunde = kundeCol.FindKunde(kundenr);
            return aktuelKunde;
        }


        // AØ Find kunde-numre
        public int FindKundenumre(int i)
        {
            return kundeCol.Kunder[i].Kundenr;
        }


        // AØ Find kunde-navne
        public string FindKundenavne(int i)
        {
            return kundeCol.Kunder[i].Navn;
        }

        public int KundeCount()
        {
            try
            {
                return kundeCol.KundeCount();
            }
            catch (Exception)
            {

                return -1;
            }
        }

        // AØ Opret Kunde
        public bool OpretKunde(int kundenr, string navn, string adresse, string by, int postnr, int cvr, int ean, long kontonr, string email)
        {
            if (dbFacade.OpretKunde(kundenr, navn, adresse, postnr, cvr, ean, kontonr, email))
            {
                if (kundeCol.OpretKunde(kundenr, navn, adresse, by, postnr, cvr, ean, kontonr, email))
                {

                }
                else
                { return false; }

                return true;
            }
            else
            {
                return false;
            }
        }


        //mads - slet kunde
        public bool SletKunde(int kundenr)
        {
            if (dbFacade.SletKunde(kundenr))
            {
                if (kundeCol.SletKunde(kundenr))
                {
                    return true;
                }
            }
            return false;
        }

        //Jesper - Rediger Kunde
        public bool OpdaterKunde(int kundenr, string navn, string adresse, string by, int postnr, int cvr, int ean, long kontonr, string email)
        {
            if (dbFacade.OpdaterKunde(kundenr, navn, adresse, postnr, cvr, ean, kontonr, email))
            {
                if (kundeCol.OpdaterKunde(kundenr, navn, adresse, by, postnr, cvr, ean, kontonr, email))
                {
                    return true;
                }
            }
            return false;
        }

        #endregion


    }
}
